package com.kaifamiao.base.Demo20210918;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;

/**
 * 班级管理系统
 * @author lucien-ma
 * @date 2021/9/18
 * @apiNote
 */
public class ClassesSystem {
    private static Scanner scanner = new Scanner(System.in);
    private static Classes[] cls = new Classes[5];
    private static Random random = new Random();
    // cls 数组的实际大小
    private static int size = 0;

    static {
        // 初始化班级
        String[] names = {"计算机1班", "计算机2班", "物联网2班", "软件2班", "工商管理2班"};
        for (int i = 0; i < cls.length; i++) {
            Classes temp = new Classes(i + 1, names[i], random.nextInt(50) + 30);
            cls[i] = temp;
            size++;
        }
    }

    public static void main(String[] args) {
        while (true) {
            index();
            System.out.print("请输入您要进行的操作编号：");
            int chose = scanner.nextInt();
            switch (chose) {
                case 1:
                    insert(inputInfo());
                    break;
                case 2:
                    System.out.println("请输入要删除的班级编号：");
                    deleteById(scanner.nextInt());
                    break;
                case 3:
                    update();
                    break;
                case 4:
                    show();
                    System.out.println("任意键继续...");
                    scanner.nextLine();
                    break;
                case 0:
                    System.out.println("Bye");
                    System.exit(0);
                    break;
                default:
                    System.out.println("请输入正确的编号！");
                    break;
            }
        }
    }

    /**
     * 系统首页
     */
    public static void index() {
        System.out.println("-------欢迎使用《班级管理系统》---");
        System.out.println("***1.新建班级");
        System.out.println("***2.删除班级");
        System.out.println("***3.修改班级");
        System.out.println("***4.查看所有班级信息");
        System.out.println("***0.退出系统");
        System.out.println("-----------------------------");
    }

    /**
     * 展示所有班级信息
     */
    public static void show() {
        System.out.println("班级编号\t\t\t班级名称\t\t\t班级人数");
        for (int i = 0; i < size; i++) {
            System.out.println(cls[i].getId()+"\t\t\t\t"+cls[i].getName()
                    +"\t\t\t\t"+cls[i].getStuNumber());
        }
    }

    /**
     * 向班级数组中添加数据
     * @param classes
     */
    public static void insert(Classes classes) {
        // 先判断数组是否存满 ，若已存满，需要扩容
        if (size == cls.length) {
            cls = Arrays.copyOf(cls, size * 2);
        }
        // 添加数据
        cls[size++] = classes;
        // 反馈
        System.out.println("添加成功");
    }

    /**
     * 根据班级编号删除一个班级
     * @param id
     */
    public static void deleteById(Integer id) {
        // 首先要找到这个班级在数组中的位置
        int index = indexOfClasses(id);
        // 是否找到，找到才进行下一步操作
        if (index == -1) {
            System.out.println("该班级不存在或已被删除！");
            return;
        }
        System.arraycopy(cls, index + 1, cls, index, size - index - 1);
        size--;
    }

    /**
     * 修改班级信息
     */
    public static void update() {
        // 输入要修改的班级编号
        System.out.println("请输入要修改的班级编号：");
        Integer id = scanner.nextInt();
        // 是否存在该班级
        int index = indexOfClasses(id);
        if (index == -1) {
            System.out.println("您要修改的班级不存在");
            return;
        }
        // 输入班级信息
        System.out.println("请输入要修改成的信息");
        Classes classes = inputInfo();
        cls[index] = classes;
        System.out.println("修改成功！");
    }

    /**
     * 根据班级编号查找数组中的存放位置
     * 找到返回下标
     * 否则返回 -1
     * @param id
     * @return
     */
    private static int indexOfClasses(Integer id) {
        for (int i = 0; i < size; i++) {
            if (cls[i].getId().equals(id)) {
                return i;
            }
        }
        return -1;
    }

    /**
     * 用来从控制台获取数据数据
     * 并封装成 Classes 类返回
     * @return
     */
    public static Classes inputInfo() {
        System.out.print("请输入班级编号：");
        Integer id = scanner.nextInt();
        System.out.print("请输入班级名称：");
        String name = scanner.next();
        System.out.print("请输入班级学生人数：");
        Integer stuNumber = scanner.nextInt();
        return new Classes(id, name, stuNumber);
    }


}



@Data
@AllArgsConstructor
@NoArgsConstructor
class Classes{
    private Integer id;
    private String name;
    private Integer stuNumber;
}
